#include "biblio.h"
#include <typeinfo>

Biblio::Biblio(){}
Biblio::~Biblio()
{
    for(unsigned int i=0;i<tab.size();i++)
    {
        delete tab[i];
    }
}
Biblio::Biblio(const Biblio& B)
{
    abn=B.abn;
    Ouvrage *p;
    for(unsigned int i=0;i<B.tab.size();i++)
    {
        if(typeid (*(B.tab[i]))== typeid(Ouvrage))
        {
            p= new Ouvrage(*(B.tab[i]));
        }
        if(typeid(*(B.tab[i]))==typeid(Livre))
        {
            p=new Livre(static_cast<const Livre&>(*(B.tab[i])));
        }
        if(typeid(*(B.tab[i]))==typeid(Video))
        {
            p=new Video(static_cast<const Video&>(*(B.tab[i])));
        }

    tab.push_back(p);
    }
}
Biblio& Biblio::operator=(const Biblio& B)
{
    Ouvrage *p;
    if(this!=&B)
    {
        for (unsigned int i=0;i<tab.size();i++)
        {
            delete tab[i];
        }
        tab.clear();//pour vider le vecteur(effacer les pointeur sur les objets compte)
        abn=B.abn;
        for(unsigned int i=0;i<B.tab.size();i++)
        {
            if(typeid (*(B.tab[i]))== typeid(Ouvrage))
            {
                p= new Ouvrage(*(B.tab[i]));
            }
            if(typeid(*(B.tab[i]))==typeid(Livre))
            {
                p=new Livre(static_cast<const Livre&>(*(B.tab[i])));
            }
            if(typeid(*(B.tab[i]))==typeid(Video))
            {
                p=new Video(static_cast<const Video&>(*(B.tab[i])));
            }

        tab.push_back(p);
        }
    }
    return *this;
}
void Biblio::afficher()
{
    for(unsigned int i=0;i<tab.size();i++)
    {
        tab[i]->afficher();
    }
}
long Biblio::trouver(string titre)
{
    for(unsigned int i=0;i<tab.size();i++)
    {
        if(tab[i]->getTitre()==titre)
        {
            return i;
        }
    }
    return -1;
}

bool Biblio::ajouter(const Ouvrage& O)
{
    if(trouver(O.getTitre())==-1)
    {
        Ouvrage *p;
        p=new Ouvrage(O);
        tab.push_back(p);
        return true;
    }    
return false;
}
bool Biblio::ajouter(const Livre& L)
{
    if(trouver(L.getTitre())==-1)
    {
        Ouvrage *p;
        p=new Livre(L);
        tab.push_back(p);
        return true;
    }    
return false;

}
bool Biblio::ajouter(const Video& V)
{
    if(trouver(V.getTitre())==-1)
    {
        Ouvrage *p;
        p=new Video(V);
        tab.push_back(p);
        return true;
    }    
return false;
}
Ouvrage* Biblio::getOuvrage(string titre)
{
    for(unsigned int i=0;i<tab.size();i++)
    {
        if(tab[i]->getTitre()==titre)
        {
            return &(*(tab[i]));
        }
    }
return 0;

}
long Biblio::chercher(long numIdent)
{
    for(unsigned int i=0;i<abn.size();i++)
    {
        if(abn[i].getNumIdent()==numIdent)
        {
            return i;
        }
    }
    return -1;
}

bool Biblio::ajouterAbn(const Abonne& A)
{
    if(chercher(A.getNumIdent())==-1)
    {
        abn.push_back(A);
        return true;
    }
return false;
}
Abonne* Biblio::getAbonne(long numIdent)
{
    for(unsigned int i=0;i<abn.size();i++)
    {
        if(abn[i].getNumIdent()==numIdent)
        {
            return &abn[i];
        }
    }
return NULL;    

}

bool Biblio::supprimerOuvrage(string titre)
{
    
    for(unsigned int i=0;i<tab.size();i++)
    {
        if(tab[i]->getTitre()==titre)
        {
            delete tab[i];
            tab.erase(tab.begin()+i);
            return true;
        }
        
    }

return false;
}

void Biblio::info()
{
     for(unsigned int i=0;i<tab.size();i++)
     {
         tab[i]->afficher();
     }
     for(unsigned int j=0;j<abn.size();j++)
     {
         abn[j].afficher();
     }

}
bool Biblio::emprunter(string titre,long numIdent)
{
    for(unsigned int i=0;i<tab.size();i++)
    {
        if(tab[i]->getTitre()==titre)
        {
            for(unsigned int j=0;j<abn.size();j++)
            {
                if(abn[j].getNumIdent()==numIdent)
                {
                    abn[j].setTitre_empr(titre);
                            
                }
            }
        
            tab[i]->setExiste(false);
            return true;
        }
            
    }
return false;
}


